package cn.doitedu.day04

import scala.util.Random

/**
 * Case的作用：
 * 1.封装数据（JavaBean）
 * 2.用来模式匹配（比直接匹配类型效率高）
 *
 * 用法：类（class）的前面要加一个case，类的名字后面必须带括号
 * 构造方法的参数，可以加val 和 var，如果没有加，就是val
 *
 * Case Class的特点：
 *  1.重写了toString
 *  2.case class不需要new，直接类名或跟括号，括号内传参，本质上调用的是apply方法
 *  3.case class 已经实现了序列化接口（将实例数据写入到文件或在网络中传输，不需要自己实现序列化接口）
 */
case class Person(
                   val id: String,
                   name: String,
                   var age: Int
                 ) {

  def printName(): Unit = {
    println(s"printName : $name")
  }


}


object Person {

  def main(args: Array[String]): Unit = {

    val p = new Person("9527", "华安", 28)

    println(p.age)
    println(p)


    val p2 = Person("9527", "唐伯虎", 28)
    val p3 = Person.apply("9527", "唐伯虎", 28)
    println(p3.name)
    p3.printName()

    //数组里面有两个case class实例
    val arr: Array[Product] = Array(Person("9527", "唐伯虎", 28), User("9527", "唐伯虎", 28), Heartbeat, Person("9528", "唐伯虎2", 38))

    val res = arr(3)
    println(res)

    res match {
      case Person(id, name, age) => {

        println(s"Person => id: $id, name: $name, age: $age")
      }
      case User(id, name, age) => {
        println(s"User => id: $id, name: $name, age: $age")
      }
      //匹配case object
      case Heartbeat => {
        println(Heartbeat.aaa)
      }
    }



  }


}
